#ifndef DATABASE_H
#define DATABASE_H

#include <QObject>
#include <QString>
#include <QList>
#include <QMap>
#include <QSet>
#include <QReadWriteLock>
#include "mediaitem.h"
#include "mediaitemimpl.h"

class Database : public QObject
{
    Q_OBJECT
public:
    Database();

    void save(const QString & filename);
    void load(const QString & filename);

    QList<MediaItemPtr> all();
    QStringList keywords();
    QStringList collections();
    QSet<MediaItemPtr> group(MediaItemPtr item);
    MediaItemPtr item(const QString & filename);
    static QString collection(const QString & root, const QString &filename);

signals:
    void added(MediaItemPtr item);
    void removed(MediaItemPtr item);
    void updated(MediaItemPtr item);

    void collectionsChanged();
    void keywordsChanged();

public slots:
    void add(MediaItemPtr item);
    void remove(MediaItemPtr item);
    void update(MediaItemPtr item, const MediaItemImpl::Metadata & metadata);

private:
    static QString groupid(const MediaItemImpl::Metadata & metadata);

private:
    QSet<MediaItemPtr> m_items;
    QMap<QString, MediaItemPtr> m_filename_index;
    QSet<QString> m_collections;
    QSet<QString> m_keywords;
    QMap<QString, QSet<MediaItemPtr> > m_group;
};

#endif // DATABASE_H
